﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using DevExpress.XtraReports.UI;
using prjKQXS_DLL;
using prjKQXS_DLL.Danh_muc;

namespace prjKQXS_UI.View
{
    public partial class frmDMDonVi : DevExpress.XtraEditors.XtraForm
    {
        #region frmDMCanBo EVENT ==================================================================
        public frmDMDonVi()
        {
            InitializeComponent();
        }

        private void frmDMDONVI_Load(object sender, EventArgs e)
        {
            loadData();
        }

        private void frmDMDonVi_Shown(object sender, EventArgs e)
        {
            cbtnSua.Enabled = clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.B_SuaDMDonVi);
        }

        private void frmDMDONVI_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (frmMain.sEdittingFormName.Contains(this.Name))
            {
                string msg = "Bạn đang thực hiện thêm mới hoặc chỉnh sửa đơn vị nhưng dữ liệu chưa được lưu.\n" +
                    "Bạn vẫn muốn thoát khỏi danh mục đơn vị?";
                if (MessageBox.Show(msg, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else
                {
                    gvDonVi.CancelUpdateCurrentRow();
                    frmMain.sEdittingFormName = frmMain.sEdittingFormName.Replace(this.Name, "");
                    this.Close();
                }
            }
        }
        #endregion ================================================================================


        #region Các nút lệnh ======================================================================
        private void sbtnSua_CheckedChanged(object sender, EventArgs e)
        {
            if (cbtnSua.Checked)
            {
                cbtnSua.Text = "Khóa";
            }
            else
            {
                chkKhoiPhuc.Checked = false;
                cbtnSua.Text = "Sửa";
                loadData();
            }

            if (gvDonVi.GetDataRow(GridControl.NewItemRowHandle) != null) //Nếu có dòng đang thêm mới trong gvDonVi
            {
                loadData();
            }

            sbtnThem.Enabled = cbtnSua.Checked;
            sbtnXoa.Enabled = cbtnSua.Checked;
            gvDonVi_DataSourceChanged(sender, e);
            chkKhoiPhuc.Enabled = cbtnSua.Checked;
            gvDonVi.OptionsBehavior.Editable = cbtnSua.Checked;
        }

        private void sbtnThem_Click(object sender, EventArgs e)
        {
            if (((DataTable)gcDonVi.DataSource).Rows.Count < 10)
            {
                enableControlForAddNew(false);
                gvDonVi.AddNewRow();

                clsDMDonVi dv = new clsDMDonVi();
                dv.OnError += new clsDMDonVi.OnErrorHandler(dv_OnError);
                gvDonVi.SetFocusedRowCellValue("Ma_DT", dv.generateMaDV());

                gvDonVi.FocusedColumn = gcolTenDV;
                gvDonVi.ShowEditor();
            }
            else
            {
                string s = "Không thể thêm đơn vị, số lượng đơn vị không thể quá 10";
                XtraMessageBox.Show(s, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void sbtnXoa_Click(object sender, EventArgs e)
        {
            int i;
            clsDMDonVi dv = new clsDMDonVi();
            if (chkKhoiPhuc.Checked)
            {
                if (gcDonVi.DataSource != null && ((DataTable)gcDonVi.DataSource).Rows.Count > 0)
                {
                    string s = "Ở chế độ khôi phục sẽ bị xóa hoàn toàn khỏi hệ thống, bạn có chắc chắn xóa dòng này ?";
                    if (clsCommon.MsgBox(s, 2) == System.Windows.Forms.DialogResult.Yes)
                    {
                        dv.Delete(gvDonVi.GetFocusedDataRow()["Ma_DT"].ToString(), false);
                        dv.OnAction += new clsDMDonVi.OnActionHandler(dv_OnAction);
                    }
                }
            }
            else
            {
                if (gcDonVi.DataSource != null && ((DataTable)gcDonVi.DataSource).Rows.Count > 0)
                {
                    if (clsCommon.MsgBox("Bạn có chắc chắn muốn xóa dòng này?", 2) == System.Windows.Forms.DialogResult.Yes)
                    {
                        dv.Delete(gvDonVi.GetFocusedDataRow()["Ma_DT"].ToString(), true);
                    }
                }
            }
            loadData();
        }

        private void sbtnIn_Click(object sender, EventArgs e)
        {
            prjKQXS_Report.rptDMDonVi rpt = new prjKQXS_Report.rptDMDonVi();
            rpt.ShowRibbonPreviewDialog();
        }

        private void sbtnLoc_Click(object sender, EventArgs e)
        {
            if (sbtnLoc.Tag.Equals("LOC"))
            {
                sbtnLoc.Tag = "BL";
                sbtnLoc.Text = "&Bỏ lọc";
                gvDonVi.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvDonVi.OptionsView.ShowAutoFilterRow = false;
                sbtnLoc.Tag = "LOC";
                sbtnLoc.Text = "&Lọc";
                gvDonVi.ClearColumnsFilter();
            }
        }

        private void sbtnKhoiPhuc_Click(object sender, EventArgs e)
        {
            string s = "Bạn có chắc chắn muốn khôi phục dòng này?";
            if (XtraMessageBox.Show(s, "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
            {
                clsDMDonVi dv = new clsDMDonVi();
                dv.OnError += new clsDMDonVi.OnErrorHandler(dv_OnError);
                dv.Restore(gvDonVi.GetFocusedDataRow()["Ma_DT"].ToString());
                loadData();
            }
        }

        private void sbtnDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion ================================================================================


        #region gvDonvi ===========================================================================
        private void gvDonVi_DataSourceChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = gvDonVi.RowCount.ToString();

            if (gvDonVi.RowCount == 0)
            {
                sbtnXoa.Enabled = false;
                sbtnIn.Enabled = false;

                if (cbtnSua.Checked) chkKhoiPhuc.Enabled = true;
                sbtnKhoiPhuc.Enabled = false;
            }
            else
            {
                gvDonVi.ClearColumnErrors();
                if (cbtnSua.Checked) sbtnXoa.Enabled = true;
                if (chkKhoiPhuc.Checked)
                {
                    sbtnKhoiPhuc.Enabled = true;
                    sbtnIn.Enabled = false;
                }
                else sbtnIn.Enabled = true;
            }

            //Đoạn này xử lý sáng/mờ nút thêm
            //if (lueDonVi.GetColumnValue("Ma_DT").ToString().Trim() == "TC")
            //{
            //    sbtnThem.Enabled = false;
            //}
            //else
            //{
                if (cbtnSua.Checked)
                {
                    DataRow dr = gvDonVi.GetDataRow(GridControl.NewItemRowHandle);
                    if (dr == null) //Nếu dr == null tức là gvDonVi không có newrecord, ngược lại là có
                    {
                        if (!chkKhoiPhuc.Checked) sbtnThem.Enabled = true;
                        else sbtnThem.Enabled = false;
                    }
                    else sbtnThem.Enabled = false;
                }
            //}
        }

        private void gvDonVi_ColumnFilterChanged(object sender, EventArgs e)
        {
            lblSoLuong.Text = gvDonVi.RowCount.ToString();
        }

        private void gvDonVi_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            frmMain.sEdittingFormName += this.Name;
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void gvDonVi_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            DataRow dr = gvDonVi.GetDataRow(e.RowHandle);
            if (dr != null)
            {
                e.Valid = RecordIsOK(dr);

                if (e.Valid) // Nếu dữ liệu nhập vào hợp lệ thì thực hiện lưu
                {
                    frmMain.sEdittingFormName.Replace(this.Name, "");

                    clsDMDonVi dv = new clsDMDonVi();
                    dv.OnError += new clsDMDonVi.OnErrorHandler(dv_OnError);

                    if (e.RowHandle == GridControl.NewItemRowHandle)
                    {
                        dv.Add(dr);
                        enableControlForAddNew(true);
                        lblSoLuong.Text = gvDonVi.RowCount.ToString();
                    }
                    else dv.Update(dr);
                }
            }
        }
        #endregion ================================================================================


        #region SUB AND FUNCTION ==================================================================
        private void enableControlForAddNew(bool enabled)
        {
            if (enabled) sbtnThem.Tag = "";
            else sbtnThem.Tag = "AddNew";

            sbtnThem.Enabled = enabled;
            sbtnXoa.Enabled = enabled;
            sbtnLoc.Enabled = enabled;
            sbtnIn.Enabled = enabled;
            chkKhoiPhuc.Enabled = enabled;
        }
        
        public void loadData()
        {
            clsDMDonVi dv = new clsDMDonVi();
            dv.OnError += new clsDMDonVi.OnErrorHandler(dv_OnError);
            gcDonVi.DataSource = dv.getAllDonVi(!chkKhoiPhuc.Checked);
        }

        #region clsDMCanBo event --------------------------------------------
        private void dv_OnInvalid(string msg)
        {
            switch (msg)
            {
                case "Ma_DT": { XtraMessageBox.Show(msg + " không hợp lệ.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning); break; }
            }
        }

        private void dv_OnAction(int actionCode)
        {
            switch (actionCode)
            {
                case -2146232060:
                    {
                        XtraMessageBox.Show("Chưa thể xóa đơn vị này, vì còn có dữ liệu liên quan", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        break;
                    }
            }
        }

        private void dv_OnError(Exception e)
        {
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion ---------------------------------------------------------

        private bool RecordIsOK(DataRow dr)
        {
            bool ok = true;

            //HÀM NÀY KIỂM TRA DỮ LIỆU NHẬP VÀO KHI THÊM MỚI HAY KHI SỬA MẨU TIN
            string msg = "";
            string madt = dr["Ma_DT"].ToString().Trim().ToUpper();

            //KIỂM TRA MÃ ĐƠN VỊ =============================================================
            Regex regexMaCB = new Regex(@"^\d$");    //Mô tả một chuỗi chỉ có 1 ký tự số 
            if (!regexMaCB.IsMatch(madt))
            {
                ok = false;
                msg = "MÃ ĐƠN VỊ không hợp lệ. Hãy nhập lại";
                gvDonVi.SetColumnError(gcolMaDV, msg);
            }

            //KIỂM TRA TÊN ĐƠN VỊ =============================================================
            if (dr["Ten_DT"].ToString().Trim() == "")    //Kiểm tra rỗng
            {
                ok = false;
                msg = "TÊN ĐƠN VỊ không được để trống.";
                gvDonVi.SetColumnError(gcolTenDV, msg);
            }
            else if (dr["Ten_DT"].ToString().Trim().Length < 5)
            {
                ok = false;
                msg = "TÊN ĐƠN VỊ quá ngắn.";
                gvDonVi.SetColumnError(gcolTenDV, msg);
            }

            return ok;
        }
        #endregion ================================================================================


        #region Các thủ tục khác ==================================================================
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if ((keyData == Keys.Escape) && (sbtnThem.Tag.ToString() == "AddNew"))    //Khi đang thêm mới mà ấn phím ESC
            {
                gvDonVi.CancelUpdateCurrentRow();
                enableControlForAddNew(true);
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void chkKhoiPhuc_CheckedChanged(object sender, EventArgs e)
        {
            if (chkKhoiPhuc.Checked) gvDonVi.OptionsBehavior.Editable = false;
            else gvDonVi.OptionsBehavior.Editable = cbtnSua.Checked;

            loadData();
        }
        #endregion ================================================================================
    }
}